はじめに
今年は例年に比べて着手が遅れているが、ようやく構想も固まって始動した。
基本的にOSのアップグレードはなく、主要コンポーネント(OpenFoam, Paraview, FreeCAD, TreeFoamなど)については、単純なバージョンアップで済むと思っていたのでのんびりしていたという面もあったが、DEXCSランチャーをどうしたものかで決めかねていた。
細部の改善項目はするとして、その前に基本的なフレームというか、枠組みをどうするかで少々試行錯誤していたのが、ようやく構想がまとまった。
新しいフレームというのは、FreeCADのワークベンチ化を目指すものであるが、そこまで出来るかどうかはともかく、その方向性でフレームを変更できそうな目処がついたので、そうする為のメモ、備忘録として残しておく。
Table of Contents
DEXCSランチャーのワークベンチ化とは
DEXCSランチャー2022
上図がDEXCS2022であったのに対し、DEXCS2023では以下のようになる予定である。
DEXCSランチャー2023(予定)
DEXCS2022では左サイドにあった、DEXCSツールバーの全ボタンが、DEXCS-WBツールバーに一本化されただけかの印象であり、それぞれのボタンの機能も基本的に大きな変化はない(予定)。
しかし、解析コンテナを起動(作成)する前には、DEXCSツールバーのアイコンが見え消し状態で使用できないのに対し、解析コンテナが作成されると使えるようになるという使い勝手の改善がある点は、評価してもらえるかもしれない。但し、この使い勝手の問題があって、フレーム変更に取り組んだということではない。
DEXCS2022における課題
フレーム変更に取り組んだ最大の理由は、DEXCS2022において、マクロパスを変更すると、DEXCSツールバーのアイコンが使えなくなってしまうからである。これらのアイコンは登録したマクロを実行しているだけなので、当然といってしまえばそれだけの事であるが・・・
少し前に、DEXCSワークベンチのハック元である、CfdOFについて記した記事の中で述べているが、DEXCS2023ではこれ(CfdOF)の同梱もありかなと考えている。そうすると、CfdOFのチュートリアルに付属のマクロを使う必要からマクロパスの変更が頻繁に起こりうることになる。DEXCSランチャー(ワークベンチ)を使いたくなったら、マクロパスをその都度手作業で変更するのはやめたいというのが、最大の動機であった。
当初は、ボタンなりメニューで、マクロパスを戻す機能を作ることは、さほど難しくなさそうで、そういう方法でも良いかと思っていたが、この際、フレーム変更に取り組んでみようと思い立った次第である。
フレーム変更とは何なのかを具体的に説明しておく。DEXCSランチャーのソースコード一式は、GitLABで公開しているが、これをファイルマネージャで見ると、
となって、ホームフォルダ下、.FreeCADという隠しフォルダ下(これを.local/share/FreeCADからシンボリック参照している)に収納されるようになっている。フォルダ直下に多くのpythonスクリプト(*.py, *.FCMacro)が収納されており、これらがマクロファイルの実体である(実は、使用されないものも多くある)。
そして、DEXCSワークベンチのソースコードは、そもそもFreeCADのワークベンチ作法に則り、Modフォルダ下に赤枠で囲ったdexcsCfdOFフォルダ下に収納されている。したがってこの部分は、FreeCADのワークベンチとしてFreeCAD Addons Repositoryに登録してFreeCADのアドオンマネージャからインストールや更新作業もできるようになる(はず)であるが、上記のマクロを含んでいない。ワークベンチの部分(Mod/dexcsCfdOF)だけを登録したところで、マクロを使えないのであれば意味がないとして、DEXCSランチャーをFreeCADのワークベンチとして登録するという動機にまでは至っていなかった。
そこで今回、マクロパス変更の問題を解決すると同時にマクロファイルとその関連ファイル一式を、Mod/dexcsCfdOF フォルダ下に収納(フレーム変更)した上で、これが実現できれば、後回しにしていたワークベンチ化も見えてくるであろうという皮算用である。
ワークベンチ化に際しての課題と対応
単純にマクロファイルと関連ファイル一式をMod/dexcsCfdOFフォルダ化に移動して、そのまま動かせるものでないという点は容易に推察できるであろう。結果的に以下の手順で、とりあえず、従来と同機能で動くものは作成できた。
マクロファイルの置き場所変更に伴うスクリプト適合と動作確認
まずは、マクロファイル一式をMod/dexcsCfdOf/Macroフォルダに移動。手動で当該フォルダをマクロパスに変更した上でマクロの動作を確認した。予想通りであったが、多くのマクロはそのままでは動かすことができなかった。
ただ基本的にエラーメッセージが出るので、都度対処していくだけではあった。たとえば、
envSet = ". " + os.path.expanduser("~") + "/.FreeCAD/runTreefoamSubset;"
としている箇所はTreeFoamの環境変数をセットするものであるが、今回は当該ファイル(runTreefoamSubset)もMod/dexcsCfdOf/Macro下に移動したので、
envSet = ". " + os.path.expanduser("~") + "/.local/share/FreeCAD/Mod/dexcsCfdOF/Macro/runTreefoamSubset;"
と変更する必要があったが、これはファイルが存在しない云々のエラーメッセージを素直に解釈して対処できる。
また、
doc = App.ActiveDocument
modelDir = os.path.dirname(doc.FileName)
としている箇所で、Appが定義されていない云々のエラーもあった。このエラーを回避(Appの定義方法)は良くわからなかったが、modelDir(モデルの存在するパス名)を取得するのに、他のマクロで、
import dexcsFunctions
modelDir = dexcsFunctions.getCaseFileName()
として取得するものがあり、こちらの方法ではエラーとならないので、この方法で統一することとした。
その他、翻訳辞書ファイルの置き場所も併せて変更するのも必要であるとし、当該箇所の参照パス名を変更した。
DEXCSツールバーからDEXCSワークベンチへの移行
次に、上記改変したマクロを、DEXCSツールバーでなく、DEXCSワークベンチに同等のツールボタンを配置して、そのボタンをクリックして動作させる方法について試行錯誤した。
DEXCSワークベンチに同等のツールボタンを配置し、そのボタンを押した時の動作を規定することは、既存のボタンの成り立ちを調べれば、容易に類推できた。つまり、FreeCADのワークベンチは、init_Gui.py というファイルが最初に読み込まれるようになっており、その内容は以下の通り。
class dexcsCfdOFWorkbench(Workbench):
""" dexcsCfdOF workbench object """
def __init__(self):
import os
import dexcsCfdTools
import FreeCAD
#icon_path = os.path.join(dexcsCfdTools.get_module_path(), "Gui", "Resources", "icons", "cfd.svg")
icon_path = os.path.join(dexcsCfdTools.get_module_path(), "Gui", "Resources", "icons", "dexcs.svg")
self.__class__.Icon = icon_path
self.__class__.MenuText = "dexcsCfdOF"
self.__class__.ToolTip = "dexcsCfdOF workbench"
from PySide import QtCore
from dexcsCfdPreferencePage import dexcsCfdPreferencePage
ICONS_PATH = os.path.join(dexcsCfdTools.get_module_path(), "Gui", "Resources", "icons")
QtCore.QDir.addSearchPath("icons", ICONS_PATH)
FreeCADGui.addPreferencePage(dexcsCfdPreferencePage, "dexcsCfdOF")
#print('debug CfdOfWB')
#prefs = dexcsCfdTools.getPreferencesLocation()
#FreeCAD.ParamGet(prefs).SetString("DefaultOutputPath", "")
def Initialize(self):
# must import QtCore in this function,
# not at the beginning of this file for translation support
from PySide import QtCore
from dexcsCfdAnalysis import _CommandCfdAnalysis
from dexcsCfdMesh import _CommandCfdMeshFromShape
from dexcsCfdMeshRefinement import _CommandMeshRegion
from dexcsCfdSolverFoam import _CommandCfdSolverFoam
FreeCADGui.addCommand('Cfd_Analysis', _CommandCfdAnalysis())
FreeCADGui.addCommand('Cfd_MeshFromShape', _CommandCfdMeshFromShape())
FreeCADGui.addCommand('Cfd_MeshRegion', _CommandMeshRegion())
cmdlst = ['Cfd_Analysis',
'Cfd_MeshFromShape', 'Cfd_MeshRegion',
'Cfd_SolverControl']
self.appendToolbar(str(QtCore.QT_TRANSLATE_NOOP("Cfd", "dexcsCfdOF")), cmdlst)
self.appendMenu(str(QtCore.QT_TRANSLATE_NOOP("Cfd", "&dexcsCfdOF")), cmdlst)
# enable QtCore translation here, todo
def GetClassName(self):
return "Gui::PythonWorkbench"
FreeCADGui.addWorkbench(dexcsCfdOFWorkbench())
ポイントとなるのは、def Initialize(self)のブロックで、28〜31行目でDEXCSワークベンチの4つのツールボタンに割り当てられるコマンドソースをインポートして、33〜35行目で_Command…を割り当てられるている箇所である。これらと類似のやり方で、コードを追加すれば良いであろうことは容易に想像がついた。
最終的に、def Initialize(self):のブロックは以下のようになった。
def Initialize(self):
# must import QtCore in this function,
# not at the beginning of this file for translation support
from PySide import QtCore
from dexcsCfdSolverSet import _CommandCfdSolverSet
from dexcsCfdAnalysis import _CommandCfdAnalysis
from dexcsCfdMesh import _CommandCfdMeshFromShape
from dexcsCfdMeshRefinement import _CommandMeshRegion
from dexcsCfdSolverFoam import _CommandCfdSolverFoam
from dexcsCfdCheckCaseFileName import _CommandCfdCheckCaseFileName
from dexcsCfdEditConstantFolder import _CommandCfdEditConstantFolder
from dexcsCfdEditSystemFolder import _CommandCfdEditSystemFolder
from dexcsCfdRunGridEditor import _CommandCfdRunGridEditor
from dexcsCfdRunPlotWatcher import _CommandCfdRunPlotWatcher
from dexcsCfdRunClearCase import _CommandCfdRunClearCase
from dexcsCfdOpenOFTerminal import _CommandCfdOpenOFTerminal
from dexcsCfdRunParaview import _CommandCfdRunParaview
from dexcsCfdRunPlotTool import _CommandCfdRunPlotTool
from dexcsCfdRunTreeFoam import _CommandCfdRunTreeFoam
from dexcsCfdRunParallel import _CommandCfdRunParallel
from dexcsCfdRunTable_GUI import _CommandCfdRunTable_GUI
from dexcsCfdMakeCfMeshSetting import _CommandCfdMakeCfMeshSetting
from dexcsCfdExportSTL import _CommandCfdExportSTL
from dexcsCfdShowSolidInfo import _CommandCfdShowSolidInfo
from dexcsCfdDowngrade import _CommandCfdDowngrade
from dexcsCfdFuse import _CommandCfdFuse
FreeCADGui.addCommand('Cfd_SolverSet', _CommandCfdSolverSet())
FreeCADGui.addCommand('Cfd_Analysis', _CommandCfdAnalysis())
FreeCADGui.addCommand('Cfd_MeshFromShape', _CommandCfdMeshFromShape())
FreeCADGui.addCommand('Cfd_MeshRegion', _CommandMeshRegion())
FreeCADGui.addCommand('Cfd_RunGridEditor', _CommandCfdRunGridEditor())
FreeCADGui.addCommand('Cfd_CheckCaseFileName', _CommandCfdCheckCaseFileName())
FreeCADGui.addCommand('Cfd_EditConstantFolder', _CommandCfdEditConstantFolder())
FreeCADGui.addCommand('Cfd_EditSystemFolder', _CommandCfdEditSystemFolder())
FreeCADGui.addCommand('Cfd_RunPlotWatcher', _CommandCfdRunPlotWatcher())
FreeCADGui.addCommand('Cfd_RunClearCase', _CommandCfdRunClearCase())
FreeCADGui.addCommand('Cfd_OpenOFTerminal', _CommandCfdOpenOFTerminal())
FreeCADGui.addCommand('Cfd_RunParaview', _CommandCfdRunParaview())
FreeCADGui.addCommand('Cfd_RunPlotTool', _CommandCfdRunPlotTool())
FreeCADGui.addCommand('Cfd_RunTreeFoam', _CommandCfdRunTreeFoam())
FreeCADGui.addCommand('Cfd_RunParallel', _CommandCfdRunParallel())
FreeCADGui.addCommand('Cfd_RunTable_GUI', _CommandCfdRunTable_GUI())
FreeCADGui.addCommand('Cfd_MakeCfMeshSetting', _CommandCfdMakeCfMeshSetting())
FreeCADGui.addCommand('Cfd_ExportSTL', _CommandCfdExportSTL())
FreeCADGui.addCommand('Cfd_ShowSolidInfo', _CommandCfdShowSolidInfo())
FreeCADGui.addCommand('Cfd_Downgrade', _CommandCfdDowngrade())
FreeCADGui.addCommand('Cfd_Fuse', _CommandCfdFuse())
cmdlst = ['Cfd_SolverSet','Cfd_Analysis',
'Cfd_MeshFromShape', 'Cfd_MeshRegion', 'Cfd_RunGridEditor',
'Cfd_SolverControl', 'Cfd_CheckCaseFileName', 'Cfd_EditConstantFolder',
'Cfd_EditSystemFolder', 'Cfd_RunPlotWatcher', 'Cfd_RunClearCase',
'Cfd_OpenOFTerminal', 'Cfd_RunParaview', 'Cfd_RunPlotTool',
'Cfd_RunTreeFoam', 'Cfd_RunParallel', 'Cfd_RunTable_GUI',
'Cfd_MakeCfMeshSetting', 'Cfd_ExportSTL', 'Cfd_ShowSolidInfo',
'Cfd_Downgrade', 'Cfd_Fuse']
self.appendToolbar(str(QtCore.QT_TRANSLATE_NOOP("Cfd", "dexcsCfdOF")), cmdlst)
self.appendMenu(str(QtCore.QT_TRANSLATE_NOOP("Cfd", "&dexcsCfdOF")), cmdlst)
# enable QtCore translation here, todo
それぞれのマクロに対して、これを呼び出すためのモジュール名やコマンド名を相応に考えて追加しただけである。問題は、importで追加したモジュールの内容をどうするかであるが、これも既存のモジュールを調べると容易に類推できる。たとえば、既存のdexcsCfdAnalysis.pyを取り上げ、その中で_CommandCfdAnalysisを定義しているブロックの内容は、以下の通りであった。
class _CommandCfdAnalysis:
""" The Cfd_Analysis command definition """
def __init__(self):
pass
def GetResources(self):
icon_path = os.path.join(dexcsCfdTools.get_module_path(), "Gui", "Resources", "icons", "cfd_analysis.png")
return {'Pixmap': icon_path,
'MenuText': QtCore.QT_TRANSLATE_NOOP("Cfd_Analysis", "Analysis container"),
'Accel': "N, C",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Cfd_Analysis", _("Creates an analysis container with a CFD solver"))}
def IsActive(self):
return FreeCAD.ActiveDocument is not None
def Activated(self):
FreeCAD.ActiveDocument.openTransaction("Create CFD Analysis")
FreeCADGui.doCommand("")
FreeCADGui.addModule("dexcsCfdAnalysis")
FreeCADGui.addModule("dexcsCfdTools")
FreeCADGui.doCommand("analysis = dexcsCfdAnalysis.makeCfdAnalysis('dexcsCfdAnalysis')")
FreeCADGui.doCommand("dexcsCfdTools.setActiveAnalysis(analysis)")
''' Objects ordered according to expected workflow '''
# Add mesh object when dexcsCfdAnalysis container is created
FreeCADGui.addModule("dexcsCfdMesh")
FreeCADGui.doCommand("analysis.addObject(dexcsCfdMesh.makeCfdMesh())")
# Add solver object when dexcsCfdAnalysis container is created
FreeCADGui.addModule("dexcsCfdSolverFoam")
FreeCADGui.doCommand("analysis.addObject(dexcsCfdSolverFoam.makeCfdSolverFoam())")
def GetResources(self):のブロックで、アイコンを定義し、 def IsActive(self):でボタンを有効にする条件を定義、def Activated(self):で、ボタンがクリックされた時の動作を定義してやれば良いとなる。
上例ではボタンが押された時の処理が多くあるが、ボタンを押した時にマクロを実行させるだけで良いのであれば、FreeCADGui.runCommand(‘Std_Macro_#’,0)として1行で済む。そこでたとえば、OpenFOAM端末を起動するマクロ(Std_Macro_17)であれば、以下のモジュール(dexcsCfdOpenOFTerminal.py)として改変するだけで良かった。
class _CommandCfdOpenOFTerminal:
def GetResources(self):
icon_path = os.path.join(dexcsCfdTools.get_module_path(), "Gui", "Resources", "icons", "image_normal.png")
return {'Pixmap': icon_path,
'MenuText': QtCore.QT_TRANSLATE_NOOP("Cfd_OpenOFTerminal", "Run OF terminal"),
'Accel': "S, P",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Cfd_OpenOFTerminal", _("Run OF terminal"))}
def IsActive(self):
return dexcsCfdTools.getActiveAnalysis() is not None
def Activated(self):
FreeCADGui.runCommand('Std_Macro_17',0)
13行目の記述で登録したマクロを起動できることを確認できている。その他の留意点として、
- アイコンファイルは、Mod/dexcsCfdOF/Gui/Resources/iconsに収納する
- 10行目の条件は、モジュール(マクロ)によってもう少しきめ細かい設定もできそうだが、当面はこれ(解析コンテナがあれば有効)でいく。
とりあえず、この方針で全マクロをDEXCSワークベンチのツールバーから起動できるようになる事を確認した。
マクロを使わないで機能させる方法
これで当面、Mod/dexcsCfdOFfフォルダ内のリソースだけを使って動くもの(FreeCADワークベンチの構成要件)は作成することが出来たが、マクロパス名を変更すると動かないという問題は残ったままである。
この先も試行錯誤であった。まず、そもそもマクロといって、pythonスクリプトであり、その実体ファイル名もわかっている。そこで。そのスクリプト(*.py)を単純にimportしてやれば良いのでないか?と考えた。上の例では、以下のように変更するだけである。
def Activated(self):
#FreeCADGui.runCommand('Std_Macro_17',0)
import openOFTerminal
やってみたところ、一部のマクロでエラーが出て、追加のスクリプト変更も必要であった。たとえば、showSolidInfo.pyにて、name ‘FreeCADGui’ is not defined というエラーメッセージが表示されたので、
import FreeCADGui
の追加が必要になったなどあったが、基本的にすべてマクロパスがどこに設定されていようとも動作することは確認できた。
これでメデタシ。。。と思ったのは束の間。ボタンを最初に押した時はちゃんと動いていたが、(上の例では)OF端末を閉じて、再度起動しようとすると次からは起動しないという症状であり、これは他のマクロについても同様であった。
FreeCADGui.runCommandでマクロを起動した場合には、新しいプロセスが立ち上がって、プロセスが終了するとちゃんと終了処理をしてくれるのに対して、import文で立ち上げた場合には、画面を閉じた時のプロセス終了処理が不十分であることが原因であろうと推察はできるのであるが、その対策方法がわからない。FreeCADGui.addCommandで、このスクリプトを登録出来ないのか?など考えたが、今の所、この方法で進めるのはギブアップ状態。どなたか専門家のアドバイスをいただきたい。
マクロを使うが、マクロパスを都度(自動で)変更
本来であれば、前項のやり方で進めるのがスジであったと思うが、一つ姑息な方法を見つけた。表題の通り、マクロパスを自動で変更すれば良いのでないか、ということである。
def Activated(self):
#FreeCADGui.runCommand('Std_Macro_17',0)
#import openOFTerminal
_macroPath = os.path.expanduser("~")+'/.local/share/FreeCAD/Mod/dexcsCfdOF/Macro'
_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro").GetString('MacroPath')
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro").SetString('MacroPath',_macroPath)
FreeCADGui.runCommand('Std_Macro_17',0)
FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro").SetString('MacroPath',_prefs)
6行目でマクロパスを所定のパス(_macroPath)に変更し、7行目でマクロ実行、それが終わったら8行目でマクロパスを元(_prefs)に戻している。2行目、3行目をコメントアウトして残してあるのは、開発経緯としての記録と、あわよくば、3行目の前項で記した方法の改良版期待である。
問題というか、備忘録として残したいのは、この方法をどうやって見つけたか?ということである。特に、FreeCAD.ParamGet(“User parameter:BaseApp/Preferences/Macro”).GetString(‘MacroPath’)によってマクロパスを取得できたのだが、具体的なパラメタ”User parameter:BaseApp/Preferences/Macro”をどうやって見つけたのかということである。
FreeCAD Documentationを彷徨っているうちにStd DlgParameterというページを見つけて、そこに何やらScriptingサンプルがあって、それを参考にしたということである。具体的には、下図に示すように、
「ツール」⇒「パラメーターを編集」メニューにて、「パラメータエディタ」が起動するので、ここからパラメタの名前を(手動で)取得できたり変更できる。これをスクリプトで変更するには上の方法が使えるという旨が記してあって、ようやく繋がったというのが顛末である。
ワークベンチ化に際して、もう一つの課題
これで全てのコードをMod/dexcsCfdOFフォルダ下に収納して動作するようになったが、これらのコードを収納しただけで使えるようになるかというと、そうはならない。収納したマクロのコードを、マクロ’Std_Macro_#’として登録する必要があり、これは、user.cfgでの設定になるからである。
DEXCS2022のランチャーもアップデートする際には、これを書き換える必要があるとしていたので、同じことをやれば良いのだが、これをもう少しスマートにやる方法もありそうである。具体的には、前項で記したパラメータエディタを使えそうなんだが、ここは少し先送りして他の課題に取り組んでいる。
ワークベンチ化で生じた新たな課題
コンテナを❶ダブルクリックするなりで、タスク画面を開くと、DEXCSツールバーの❷全ボタンが使用できなくなってしまう。
こういうものだと思って使ってもらえば良いかもしれないが、実際に使ってみると、計算が長時間かかる場合に、残渣グラフの推移しか見られないのは、何とも歯がゆい状況になる。「編集」ボタンを押せばファイルマネージャが使えるので、パラメタ変更はかろうじて可能ではあるが、せっかくプロットツールがありながらこれを使えないのは残念であった。
タスク実行中に、これらのボタンを使えるようにする方法はないかと調べたが、どうにもわからなかった。
新たな課題に対する対応
そこで、タスク画面中に「プロット」なるボタンを配置し、これを❶クリックすればプロットツールが立ち上がるようにした。何とも場当たり的な対応でしかなく、いかにもDEXCS的な対応といってよいであろう。ツールボタンを使えるようにする方法がわかれば一番良かったのであるが、、、
新レポジトリ(GitLab ⇒ GitHub)
DEXCS2022のDEXCSランチャーはGitLabにて公開している。Gitでソースコード管理している理由は、DEXCSのコードを開発する協力者が現れるようになってくれたのが最大の理由である。
DEXCS2023でも、新たに協力者があって、GitLabのプロジェクトに開発者として招待メールを送ろうとしたのだが、GitLabはいつの間にか無料枠で使えるユーザー数が制限されてしまっており、これが原因で、新たな開発協力者を招待できなくなってしまった。
GitLabではGitLab for Open Source など、パブリックに公開されるプロジェクトには適用されないので、こちらへの移行も推奨されており、それを試みもしたが、日本語の解説ページもなく、要領が良くわからずに挫折した。
一方、ネットで調べると、GitLabのユーザー数制限という問題に対し、GitHubへ移行するという日本語記事が多くあったので、この際、GitLabで公開しているものと同様の内容をGitHubでも公開できるようにした。
GitHubではユーザー数制限の問題はなく、次項で述べるGitKrahkenというGUIツールを使ってGitHub上のソースコード管理ができることも確認できているので、今の所の方針として、上記2つのプロジェクトはあくまでDEXCS2022ベースのDEXCSランチャー用のリポジトリとして使用し、DEXCS2023からは、GitHubにて新しいレポジトリを作成して運用していこうと考えている。
GitKrahken
GitKrahkenというのは、Gitクライアントで、一々Gitコマンドを打ち込むのは勘弁してもらいたいという人向けのGUIツールである。ただGitコマンドといって、OpenFOAMのコマンドに比べれば、そんなに沢山覚える必要もなく、CUIでやれている人は多くいて、開発協力者さんにもそれが出来ればそれでも良いのだが、DEXCSというのは、極力GUIで操作できることを目指しており、自分自身がGUIでやりたいので、数年前からこのツールを使ってきた。
問題は、これまではGitLab上のソースコード管理で使っていたのに対して、今回はGitHubに変更したところである。GitKrahkenそのものは、GitLabだけでなく、GitHubやその他のサーバーに対応していることはわかっていた(下図参照)が、
当初、GitHubから、Pullは出来ても、どうしてもPushできなくて困惑した。
実は、これまでGitKrahkenで使っていたユーザーアカウントと、GitHubで登録したユーザーアカウントが異なっていたので、GitHubで登録したアカウントでPushしようとしたのが原因であった。GitKrahkenを複数のユーザーアカウントで使用するには、無償版ではなく有料版を使えということであった。
GitHubのサーバー側では複数アカウントを使い分けたい理由はありそうだが、クライアントでアカウントを使い分けたい理由は特にないので。今回はサーバー側で新しいユーザーアカウント(GitKrahkenで使用しているもの)を作成することで、従来通りのPush作業ができるようになった。
あとは、開発協力者向けにブランチを作成して、作業してもらい、本体にマージするあたりの手順を備忘録として取りまとめていく予定である。